import trigger from '../../effect/trigger.js';
import { TriggerOpTypes, hasChanged } from '../../utils/index.js';

/**
 * 设置属性值的处理函数
 * @param {*} target 目标对象
 * @param {*} key 属性名
 * @param {*} value 属性值
 * @returns {boolean} 是否设置成功
 */
export default function setHandler(target, key, value) {
  const oldVal = target[key];
  // 处理数组长度
  const len = Array.isArray(target) ? target.length : undefined;
  const type = target.hasOwnProperty(key) ? TriggerOpTypes.SET : TriggerOpTypes.ADD;
  const res = Reflect.set(target, key, value);

  // 处理数组长度变化
  if (Array.isArray(target) && len !== undefined) {
    if (key !== 'length') {
      // 处理隐式数组长度增加
      trigger(target, TriggerOpTypes.SET, 'length');
    } else {
      // 处理显示数组长度减少时，删除超出长度的元素
      for (let i = target.length; i <= len; i++) {
        trigger(target, TriggerOpTypes.DELETE, i.toString());
      }
    }
  }

  // 只有当值发生变化时才触发事件
  if (hasChanged(value, oldVal)) {
    trigger(target, type, key);
  }
  return res;
}
